let myHandler = async function (event, context, callback, logger) {
  logger.info(event);

  // 获取端侧传递的参数
  let birthday = event.body?JSON.parse(event.body).birthday : event.birthday;

  try {
    // 计算宝宝的年龄
    const babyAge = calculateBabyAge(birthday);
    // 返回结果
    callback({
      code: 200,
      desc: "Success.",
      data: babyAge
    })
  } catch (error) {
    // 返回结果
    callback({
      code: 0,
      desc: error
    });
  }
};

export { myHandler };

/**
 * 表示宝宝年龄的类
 */
class BabyAge {
  years: number;
  months: number;
  days: number;
  totalDays: number;

  /**
   * @param {number} years - 年数
   * @param {number} months - 月数
   * @param {number} days - 天数
   * @param {number} totalDays - 总天数
   */
  constructor(years, months, days, totalDays) {
    this.years = years;
    this.months = months;
    this.days = days;
    this.totalDays = totalDays;
  }

  /**
   * 获取格式化的年龄字符串
   * @returns {string} 格式化的年龄字符串
   */
  toString() {
    return `${this.years}岁${this.months}个月${this.days}天`;
  }

  /**
   * 获取总天数的描述
   * @returns {string} 总天数的描述
   */
  getTotalDaysString() {
    return `总共${this.totalDays}天`;
  }

  /**
   * 获取完整的年龄描述
   * @returns {string} 完整的年龄描述
   */
  getFullDescription() {
    return `${this.toString()}（${this.getTotalDaysString()}）`;
  }

  /**
   * 转换为JSON对象
   * @returns {Object} 包含年龄信息的对象
   */
  toJSON() {
    return {
      years: this.years,
      months: this.months,
      days: this.days,
      totalDays: this.totalDays
    };
  }
}

/**
 * 计算宝宝从出生到现在的详细年龄信息
 * @param {string} birthDate - 宝宝出生日期，格式：YYYY-MM-DD
 * @returns {BabyAge} 包含年、月、天的BabyAge实例
 */
function calculateBabyAge(birthDate) {
  // 将生日字符串转换为Date对象
  const birth = new Date(birthDate);
  const today = new Date();

  // 确保输入的日期格式正确
  if (isNaN(birth.getTime())) {
    throw new Error('请输入正确的日期格式：YYYY-MM-DD');
  }

  // 检查生日是否在将来
  if (birth > today) {
    throw new Error('出生日期不能在将来');
  }

  // 计算年份差异
  let years = today.getFullYear() - birth.getFullYear();
  let months = today.getMonth() - birth.getMonth();
  let days = today.getDate() - birth.getDate();

  // 处理月份为负数的情况
  if (days < 0) {
    months--;
    // 获取上个月的最后一天
    const lastMonth = new Date(today.getFullYear(), today.getMonth(), 0);
    days += lastMonth.getDate();
  }

  // 处理月份为负数的情况
  if (months < 0) {
    years--;
    months += 12;
  }

  // 计算总天数
  const totalDays = Math.floor((today.getTime() - birth.getTime()) / (1000 * 60 * 60 * 24));

  // 返回BabyAge实例
  return new BabyAge(years, months, days, totalDays);
}